package dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import model.Cidade;

class CidadeDAO implements ICidadeDAO {

	@Override
	public boolean insert(Cidade c) {
		String sql = "insert into cidade (nmCidade,sgEstado) values (?,?)";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, c.getNmCidade() );
			ps.setObject(2, c.getSgEstado() );
			
			return ps.executeUpdate() > 0;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return false;
	}

	@Override
	public boolean update(Cidade c) {
		String sql = "update cidade set nmCidade = ? , sgEstado = ? where idCidade = ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, c.getNmCidade() );
			ps.setObject(2, c.getSgEstado() );
			ps.setObject(3, c.getIdCidade() );
			
			return ps.executeUpdate() > 0;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return false;
	}

	@Override
	public boolean delete(Cidade c) {
		String sql = "delete from cidade where idCidade = ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, c.getIdCidade() );
			
			return ps.executeUpdate() > 0;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
	
		return false;
	}

	@Override
	public Cidade findById(int id) {
		String sql = "select idCidade, nmCidade, sgEstado from cidade where idCidade = ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, id );
			
			ResultSet rs = ps.executeQuery();
			
			return rs.next() ? 
					new Cidade(rs.getInt("idCidade"),
							rs.getString("nmCidade"),
							rs.getString("sgEstado") ) : null;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		
		return null;
	}

	@Override
	public List<Cidade> findAll() {
		List<Cidade> cidades = new ArrayList<Cidade>();
		String sql = "select idCidade, nmCidade, sgEstado from cidade";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			
			ResultSet rs = ps.executeQuery();
			
			while ( rs.next() ) {
				cidades.add( new Cidade(rs.getInt("idCidade"),
						rs.getString("nmCidade"),
						rs.getString("sgEstado") ) );
			} 
					
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		
		
		return cidades;
	}

	@Override
	public List<Cidade> findCidadeBySgEstado(Cidade c) {
		List<Cidade> cidades = new ArrayList<Cidade>();
		String sql = "{ call listar_cidades_UF( ? ) } ";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			CallableStatement cs = conn.prepareCall(sql);
			cs.setObject(1, c.getSgEstado() );
			
			ResultSet rs = cs.executeQuery();
			
			while ( rs.next() ) {
				cidades.add( new Cidade(rs.getInt("idCidade"),
						rs.getString("nmCidade"),
						rs.getString("sgEstado") ) );
			} 
					
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		
		
		return cidades;
	}

	@Override
	public List<String> findAllEstados() {
		List<String> estados = new ArrayList<String>();
		String sql = "select distinct sgestado as estado from cidade";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			
			ResultSet rs = ps.executeQuery();
			
			while ( rs.next() ) {
				estados.add( 
						rs.getString("estado")  );
			} 
					
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		
		
		return estados;
	}

	@Override
	public List<Cidade> findCidadeByName(Cidade c) {
		List<Cidade> cidades = new ArrayList<Cidade>();
		String sql = "select idCidade, nmCidade, sgEstado from cidade where nmCidade like ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, c.getNmCidade() + "%");
			
			ResultSet rs = ps.executeQuery();
			
			while ( rs.next() ) {
				cidades.add( new Cidade(rs.getInt("idCidade"),
						rs.getString("nmCidade"),
						rs.getString("sgEstado") ) );
			} 
					
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		
		
		return cidades;
	}

	
	
}
